package com.it.reggie.Controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.it.reggie.Service.ShoppingCartService;
import com.it.reggie.common.BaseContext;
import com.it.reggie.common.R;
import com.it.reggie.entity.ShoppingCart;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import java.time.LocalDateTime;
import java.util.List;


@Slf4j
@RestController
@RequestMapping("/shoppingCart")
public class ShoppingCartController {


    @Autowired
    private ShoppingCartService shoppingCartService;


    @PostMapping("/add")
    public R<String> add(@RequestBody ShoppingCart shoppingCart , HttpServletRequest request){


        log.info("ShoppingCart {}",shoppingCart);
        //session 获取用户id
        Long id = (Long) request.getSession().getAttribute("user");

        Long dishId = shoppingCart.getDishId();
        // 2、查询当前客户端想要添加到购物车中的菜品数据是否已经添加过到购物车数据库当中了
        LambdaQueryWrapper<ShoppingCart> queryWrapper = new LambdaQueryWrapper<>();

        queryWrapper.eq(ShoppingCart::getDishId,dishId);
        queryWrapper.eq(ShoppingCart::getUserId,id); //用户id

        // 拼接的SQL： select * from shopping_cart where dish_id = dishId and user_id =id;
        // 也就是说查询一下购物车数据库当中是否已经存在了客户端添加的菜品数据，如果能查出来数据，
        // 那么说明购物车数据库当中肯定有了该菜品的数据了。
        // (因为有number字段的存在，那么相同的数据肯定就占用数据库那一条，所以用getOne即可)
        ShoppingCart one = shoppingCartService.getOne(queryWrapper);

            if (one !=null){
                /**
                 *  注：如果one不为null的话，那么ShoppingCart one = shoppingCartService.getOne(queryWrapper);
                 *     就已经把数据库中的那条菜品数据查询出来封装在了one对象属性中了。
                 */

                // 3、不为null，那么就说明购物车数据库当中已经有了该菜品数据，那么我们就不需要再次添加该相同的商品到数据库当中了，
                // 我们只需要把数据库中有的那个相同的商品的number字段+1即可

                // 我们知道上面我们已经把数据库中相同的那个菜品查询出来了，我们这里只需要把他的number+1然后修改到购物车数据库当中即可
                Integer number = one.getNumber();
                // one对象当中已经查询出来了那条数据，因此这里可以直接利用one对象进行操作
                one.setNumber(number+1);

                // 调用修改功能把修改后的那条商品数据传递到数据库当中去
                shoppingCartService.updateById(one);    // 把修改后的one对象传递过去

            }else {
                //  4、到这里为null，就说明购物车数据库当中没有移动端用户添加进来的数据，那么我们就把这个移动端想要加入购物车的
                //      的数据添加到数据库中保存即可
                shoppingCart.setNumber(1);    // 因为第一次添加到数据库当中，那么数量就写1即可。
                shoppingCart.setCreateTime(LocalDateTime.now());
                shoppingCart.setUserId(id);   // 把移动端登录的用户id也存入到数据库当中去，要不然不知道这个购物车是谁添加的。
                shoppingCartService.save(shoppingCart);
            }


        return R.success("添加成功");
    }
    @GetMapping("/list")
    public R<List<ShoppingCart>> list(){

        log.info("查看购物车");

        LambdaQueryWrapper<ShoppingCart> queryWrapper = new LambdaQueryWrapper<>();

        queryWrapper.eq(ShoppingCart::getUserId, BaseContext.getCunrrenId());

        queryWrapper.orderByAsc(ShoppingCart::getCreateTime);

        List<ShoppingCart> list = shoppingCartService.list(queryWrapper);

        return R.success(list);

    }

    /**
     * 清空购物车
     * @return
     */
    @DeleteMapping("/clean")
    public R<String> clean(){
        LambdaQueryWrapper<ShoppingCart> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(ShoppingCart::getUserId,BaseContext.getCunrrenId());
        shoppingCartService.remove(queryWrapper);
        return R.success("清空购物车成功");
    }
}
